package com.cskaoyan.javase.oop2._1extends._10final._2method;

/**
 * final修饰方法,表示最后的方法,最终的方法.
 * 表示方法虽然可以继承,但是不能被重写!!
 * 语法:
 * [访问权限修饰符] final 返回值类型 方法名(形参列表){
 *      // 方法体
 * }
 *
 * 什么样的成员方法应该设置为final呢？
 *      1.方法的设计已经比较完善，不需要子类进行修改了
 *          子类只需要乖乖继承，使用父类的实现即可。
 *          比如一旦修改就会导致问题、bug等时，就可以设置为final修饰。
 *          这种设置final方法的典型是Object类当中的getClass()方法
 *
 *      2.即便是父类的方法不是很完善
 *      但只要是希望子类不要改写方法都可以这么做。
 *      （要么你就用，不爽你就自己实现一个）
 *
 * 总之,开发中还是比较少见final修饰方法的,了解语法就够了.
 *
 * final关键字在修饰方法时,并不是所有方法都可以,比如构造方法
 * 构造器是不能被final修饰的
 * 除此之外,还有两个方法:
 *      1.static方法
 *      2.私有方法
 *      这两个方法本身就不能重写,那么再用final修饰是没必要的
 *
 * @since 11:20
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        new Son().test();
    }
}

class Person {
    final void eat() {
        System.out.println("人吃饭,都是要吃正常的东西!");
    }

    // 'static' method declared 'final' 画蛇添足 多此一举 本身就不能重写
    public static void testStatic() {
    }

    // 私有方法
    // 'private' method declared 'final'
    private void test2() {
    }

    // Modifier 'final' not allowed here
    public Person() {
    }
}

class LaoBa extends Person {
    /*@Override
    void eat() {
        System.out.println("我吃点别的东西!");
    }*/
}

class Father {
    public final void test() {
        System.out.println("test");
    }
}

class Son extends Father {
    // @Override
    // 'test()' cannot override 'test()' in 'com.cskaoyan.javase.oop2._1extends._10final._2method.Father'; overridden method is final
    // public void test() {
    //     super.test();
    // }
}